home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks95 / MagicTitleHack.sit / MagicTitle / MagicTitle Source&Stuff / Source / FinderAE.c < prev    next >
Text File  |  1995-06-22  |  4KB  |  176 lines

  1. // FinderAE.c
  2.  
  3. #include "FinderAE.h"
  4. #include <AppleEvents.h>
  5. #include <AERegistry.h>
  6. #include <Aliases.h>
  7.  
  8. #include "FileSystemStuff.h"
  9.  
  10. OSErr SelectItem(const FSSpec *file, Boolean bringInFront)
  11. {
  12.     FSSpec parent;
  13.     OSErr err = GetParent(file, &parent);
  14.     
  15.     if(!err)
  16.         err = FinderOpen(&parent, bringInFront);
  17.     
  18.     if(!err)
  19.         err = SendRevealEvent(&parent, file, bringInFront);
  20.         
  21.     return err;
  22. }
  23.  
  24. OSErr FinderOpen(const FSSpec *item, Boolean bringInFront)
  25. {
  26.     FSSpec parent;
  27.     
  28.     OSErr err = GetParent(item, &parent);
  29.     if(err == fnfErr)
  30.         err = SendOpenSelectionEvent(item, item, bringInFront);    
  31.     else if(!err)
  32.         err = SendOpenSelectionEvent(&parent, item, bringInFront);
  33.         
  34.     if(!err && bringInFront)
  35.         ActivateFinder();
  36.         
  37.     return err;
  38. }
  39.  
  40.  
  41. OSErr SendRevealEvent(const FSSpec *parent, const FSSpec *item, Boolean bringInFront)
  42. {
  43.     OSType signature = 'MACS';
  44.     AEDesc addr = { typeNull, nil };
  45.     AEDescList list = { typeNull, nil };
  46.     AppleEvent event = { typeNull, nil }, reply = { typeNull, nil };
  47.     AliasHandle alias = nil;
  48.     AESendMode mode = kAENoReply;
  49.         
  50.     
  51.     OSErr err = NewAlias( 0, item, &alias );
  52.     if(err) goto exit;
  53.     
  54.     err = AECreateDesc (typeApplSignature, (Ptr) &signature, sizeof (signature), &addr);
  55.     if(err) goto exit;
  56.     
  57.     err = AECreateAppleEvent (kAEFinderEvents, kAERevealSelection, &addr, 0, 0, &event);
  58.     if(err) goto exit;
  59.  
  60.     err = AECreateList (nil, 0, false, &list);
  61.     if(err) goto exit;
  62.     
  63.     HLock((Handle)alias);
  64.     err = AEPutPtr( &list,  0, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
  65.     DisposeHandle((Handle) alias);
  66.     if(err) goto exit;
  67.     
  68.     err = NewAlias( 0, parent, &alias );
  69.     if(err) goto exit;
  70.     
  71.     HLock((Handle)alias);
  72.     err = AEPutParamPtr (&event, keyDirectObject, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
  73.      DisposeHandle( (Handle)alias );
  74.     if(err) goto exit;
  75.     
  76.     err = AEPutParamDesc (&event, keySelection, &list);
  77.     if(err) goto exit;
  78.     
  79.     if(bringInFront)
  80.         mode += kAECanSwitchLayer;
  81.     err = AESend (    &event, &reply, mode, kAENormalPriority, kAEDefaultTimeout, nil, nil);
  82.     
  83.     exit:
  84.         if(addr.descriptorType != typeNull)
  85.             AEDisposeDesc (&addr);
  86.         if(event.descriptorType != typeNull)
  87.             AEDisposeDesc (&event);
  88.         if(reply.descriptorType != typeNull)
  89.             AEDisposeDesc (&reply);
  90.         if(list.descriptorType != typeNull)
  91.             AEDisposeDesc (&list);
  92.  
  93.     return err;                
  94. }
  95.  
  96.  
  97. OSErr SendOpenSelectionEvent(const FSSpec *parent, const FSSpec *item, Boolean bringInFront)
  98. {
  99.     OSType signature = 'MACS';
  100.     AEDesc addr = { typeNull, nil };
  101.     AEDescList list = { typeNull, nil };
  102.     AppleEvent event = { typeNull, nil }, reply = { typeNull, nil };
  103.     AliasHandle alias = nil;
  104.     AESendMode mode = kAENoReply;
  105.     
  106.     OSErr err = NewAlias( 0, item, &alias );
  107.     if(err) goto exit;
  108.     
  109.     err = AECreateDesc (typeApplSignature, (Ptr) &signature, sizeof (signature), &addr);
  110.     if(err) goto exit;
  111.     
  112.     err = AECreateAppleEvent (kAEFinderEvents, kAEOpenSelection, &addr, 0, 0, &event);
  113.     if(err) goto exit;
  114.  
  115.     err = AECreateList (nil, 0, false, &list);
  116.     if(err) goto exit;
  117.     
  118.     HLock((Handle)alias);
  119.     err = AEPutPtr( &list,  0, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
  120.     DisposeHandle((Handle) alias);
  121.     if(err) goto exit;
  122.     
  123.     err = NewAlias( 0, parent, &alias );
  124.     if(err) goto exit;
  125.     
  126.     HLock((Handle)alias);
  127.     err = AEPutParamPtr (&event, keyDirectObject, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
  128.      DisposeHandle( (Handle)alias );
  129.     if(err) goto exit;
  130.     
  131.     err = AEPutParamDesc (&event, keySelection, &list);
  132.     if(err) goto exit;
  133.             
  134.     if(bringInFront)
  135.         mode += kAECanSwitchLayer;
  136.     err = AESend (    &event, &reply, mode, kAENormalPriority, kAEDefaultTimeout, nil, nil);
  137.     
  138.     exit:
  139.         if(addr.descriptorType != typeNull)
  140.             AEDisposeDesc (&addr);
  141.         if(event.descriptorType != typeNull)
  142.             AEDisposeDesc (&event);
  143.         if(reply.descriptorType != typeNull)
  144.             AEDisposeDesc (&reply);
  145.         if(list.descriptorType != typeNull)
  146.             AEDisposeDesc (&list);
  147.  
  148.     return err;                
  149. }
  150.  
  151. OSErr ActivateFinder()
  152. {
  153.     ProcessSerialNumber    psn;
  154.     ProcessInfoRec            theProc;
  155.     OSErr err = noErr;
  156.     psn.highLongOfPSN = 0;
  157.     psn.lowLongOfPSN = kNoProcess;
  158.     
  159.     theProc.processInfoLength = sizeof(ProcessInfoRec);
  160.     theProc.processName = 0;
  161.     theProc.processAppSpec = 0;
  162.     theProc.processLocation = 0;
  163.     
  164.     while (err == noErr) 
  165.         {
  166.         OSErr err = GetNextProcess(&psn);
  167.         err = GetProcessInformation(&psn, &theProc);
  168.         if ((theProc.processType == 'FNDR') &&
  169.              (theProc.processSignature == 'MACS'))
  170.             break;
  171.         }
  172.     if(err == noErr)
  173.         err = SetFrontProcess(&psn);
  174.     return err;
  175. }
  176.